package org.example.rabbitmq.all;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author zfj
 * @date 2022/2/21 -11:44
 */
public class Producer {
	public static void main(String[] args) throws IOException, TimeoutException {
		//所有的中间件技术都是基于tcp/ip协议基础上构建新型的协议规范，
		// 只不过rabbitmq遵循amqp协议
		//ip 端口

		//1.创建连接工程
		ConnectionFactory connectionFactory = new ConnectionFactory();
		connectionFactory.setHost("127.0.0.1");
		connectionFactory.setPort(5672);
		connectionFactory.setUsername("admin");
		connectionFactory.setPassword("admin");
		//消息发送到根节点上
		connectionFactory.setVirtualHost("/");
		Connection connection=null;
		Channel channel=null;
		try {
			//2.创建连接Connection rabbitmq为什么是基于通道channel连接而不是链接？ 长连接-------信道channel
			connection=connectionFactory.newConnection("生产者");
			//3.通过连接获取通道Channel
			channel = connection.createChannel();
			//4.通过创建交换机，声明队列，绑定关系，路由key，发送消息和接收消息
//			String queryName="queue1";
		/*
		@params1 队列的名字
		@params2 是否要持久化Durable-false 所谓的持久化就是是否存盘，如果是false，非持久化true是持久化？非持久化会存盘嘛？会存盘，但是会随着服务器重启会丢失
		@params3 排他性 是否独立
		@params4 是否自动删除，随着最后一个消费者消息完毕消息以后是自动把队列删除
		@params5 携带一些附加参数
		 */
//			channel.queueDeclare(queryName,false,false,false,null);
			//5.准备消息内容
			String msg="Hello 富景!，你是最棒的";
			//准备交换机
			String exchangeName="direct-message-exchange";
			//指定交换机类型
			//交换机类型direct/topic/fanout/headers
			String exchangeType="direct";

			//6.发送消息给队列 @params1:交换机，@params12:路由key @params3:消息状态控制 @params4:消息主题
			//面试题：可以存在没有交换机的队列嘛？不可能，虽然没有指定交换机，但存在默认的交换机
			//声明交换机，所谓持久化就是☞交换机会不会随着服务器重启造成丢失，如果是true代表不会丢失，false代表会丢失
			channel.exchangeDeclare(exchangeName,exchangeType,true);
			//声明队列
			channel.queueDeclare("queue4",true,false,false,null);
			channel.queueDeclare("queue5",true,false,false,null);
			channel.queueDeclare("queue6",true,false,false,null);
			channel.queueBind("queue4",exchangeName,"order");
			channel.queueBind("queue5",exchangeName,"order");
			channel.queueBind("queue6",exchangeName,"course");
			channel.basicPublish(exchangeName,"order", null,msg.getBytes());
			System.out.println("消息发送成功");
		}catch (Exception ex){
			ex.printStackTrace();
		}finally {
			//7.关闭连接
			if(channel!=null&&channel.isOpen()){
				try {
					channel.close();
				}catch (Exception e){
					e.printStackTrace();
				}
			}
			//8.关闭通道
			if(connection!=null&&connection.isOpen()){
				try {
					connection.close();
				}catch (Exception e){
					e.printStackTrace();
				}
			}
		}
	}
}
